package com.wlhse.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.wlhse.dao.CheckItemDao;
import com.wlhse.dao.CheckItemStardardDao;
import com.wlhse.dao.CheckListDao;
import com.wlhse.dao.LeaderCheckItemDao;
import com.wlhse.dto.CheckListItemsDto;
import com.wlhse.dto.QHSEECheckRecord;
import com.wlhse.dto.inDto.HSEImportMapDto;
import com.wlhse.dto.inDto.ProblemListInDto;
import com.wlhse.dto.outDto.QHSEECheckRecordNumsDto;
import com.wlhse.dto.outDto.QhseeSystemDto;
import com.wlhse.entity.*;
import com.wlhse.exception.WLHSException;
import com.wlhse.service.CheckItemService;
import com.wlhse.util.R;
import com.wlhse.util.SortCodeUtil;
import com.wlhse.util.TreeUtil;
import com.wlhse.util.state_code.CodeDict;
import com.wlhse.util.state_code.NR;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import sun.security.util.Length;

import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;

@Service
public class CheckItemServiceImpl implements CheckItemService {

    @Resource
    private CheckItemDao checkItemDao;

    @Resource
    private CheckItemPojo checkItemPojo;

    @Resource
    private SortCodeUtil sortCodeUtil;

    @Resource
    private CheckItemStardardDao checkItemStardardDao;

    @Resource
    private LeaderCheckItemDao leaderCheckItemDao;

    @Resource
    private TreeUtil treeUtil;
    @Resource
    private CheckListDao checkListDao;

    private static final int checkItemStep = 4;

    @Override
    public String getTreeDto() {
        return NR.r(treeUtil.generalGetChechItemTree(checkItemDao.getAllCheckItemPojo()));
    }

    @Override
    public String getTreeDtoV2() {
        List<CheckItemPojo> list1 = checkItemDao.getAllCheckItemPojo();
        List<LeaderCheckItemPojo> list2 = leaderCheckItemDao.queryLeaderCheckItem();
        return NR.r(treeUtil.getChechItemTreeV2(list1, list2));
    }

    @Override
    @Transactional
    //修改
    public String addCheckItem(String parentCode, String checkItemName) {
        if (StringUtils.isNotBlank(checkItemName))
            throw new WLHSException("输入为空");
        String code = checkItemDao.queryMaxSon(parentCode, checkItemStep);
        if ("".equals(code)) {
            StringBuilder builder = new StringBuilder(parentCode);
            for (int i = 0; i < checkItemStep - 1; i++) {
                builder.append("0");
            }
            builder.append("1");
            code = builder.toString();
        } else {
            code = sortCodeUtil.getMaxCodeString(code);
        }
        checkItemPojo.setStatus("启用");
        checkItemPojo.setCheckItemName(checkItemName);
        checkItemPojo.setCheckItemCode(code);
        int i = checkItemDao.addCheckItemPojo(checkItemPojo);
        StringBuilder other = new StringBuilder(parentCode);
        for (int j = 0; j < checkItemStep; j++) {
            other.append("0");
        }
        //添加其它
        if (null == checkItemDao.queryByCheckItemCode(other.toString())) {
            checkItemPojo.setCheckItemName("其它");
            checkItemPojo.setCheckItemCode(other.toString());
            checkItemDao.addCheckItemPojo(checkItemPojo);
        }
        return NR.r();
    }

    @Override
    @Transactional
    public String updateCheckItem(CheckItemPojo checkItemPojo) {
        String checkItemCode = checkItemPojo.getCheckItemCode();
        String checkItemName = checkItemPojo.getCheckItemName();
        if (!StringUtils.isNotBlank(checkItemCode) && StringUtils.isNotBlank(checkItemName))
            throw new WLHSException("输入为空");
        if (checkItemDao.updateCheckItemPojo(checkItemPojo) <= 0)
            throw new WLHSException("更新失败");
        return NR.r();
    }

    @Override
    @Transactional
    public String deleteCheckItem(CheckItemPojo checkItemPojo) {
        String checkItemCode = checkItemPojo.getCheckItemCode();
        checkItemDao.deleteCheckItemPojo(checkItemCode);
        checkItemStardardDao.deleteCheckItemStardard(checkItemCode);
        return NR.r();
    }

    @Override
    public String getCheckItemContent(String checkItemCode) {
        List<String> content = checkItemStardardDao.getContentByCode(checkItemCode);
        return NR.r(content, 0, 0);
    }

    @Override
    @Transactional
    public String addCheckItemStandard(CheckItemStardardPojo checkItemStardardPojo) {
        Integer serialNO;
        if (checkItemStardardDao.getLastSerialNOByCode(checkItemStardardPojo.getCheckItemCode()) == null) {
            serialNO = 1;
        } else {
            serialNO = checkItemStardardDao.getLastSerialNOByCode(checkItemStardardPojo.getCheckItemCode());
        }
        checkItemStardardPojo.setSerialNo(serialNO);
        if (checkItemStardardDao.addCheckItemStardardPojo(checkItemStardardPojo) <= 0)
            throw new WLHSException("插入失败");
        return NR.r();
    }

    @Override
    @Transactional
    public String deleteCheckItemStandard(String id) {
        if (checkItemStardardDao.deleteCheckItemStardard(id) <= 0)
            throw new WLHSException("删除失败");
        return NR.r();
    }

    @Override
    public R add_check_item(CheckListItemsDto checkListItemsDto) {
        if(null!=checkListItemsDto.getCheckListItemCode()&&checkListItemsDto.getCheckListItemCode().length()==2) {
            List<String> list=checkItemDao.query_MAXcheck_item_num(checkListItemsDto.getCheckListID(),checkListItemsDto.getCheckListItemCode());//查询最大子节点
            if(list.size()<10)
            checkListItemsDto.setCheckListItemCode(checkListItemsDto.getCheckListItemCode()+"0"+String.valueOf(list.size()));//节点code进入
            else checkListItemsDto.setCheckListItemCode(checkListItemsDto.getCheckListItemCode()+String.valueOf(list.size()));//节点code进入

            checkListItemsDto.setStatus("启用");
            System.out.println(checkListItemsDto);
            checkItemDao.add_check_item(checkListItemsDto);
            return R.ok();
        }
        int num=checkItemDao.query_check_item_num(checkListItemsDto.getCheckListID());//根节点数量
        if(num<=9)checkListItemsDto.setCheckListItemCode("0"+String.valueOf(num));
        else checkListItemsDto.setCheckListItemCode(String.valueOf(num));
        checkListItemsDto.setStatus("启用");
        int i=checkItemDao.add_check_item(checkListItemsDto);//根节点插入
        System.out.println(checkListItemsDto);
        if(i<=0)return R.error("增加失败");
        return R.ok();
    }

    @Override
    public R add_check_items(CheckListItemsDto checkListItemsDto) {
        return null;
    }

    @Override
    public R update_check_items(CheckListItemsDto checkListItemsDto) {
        checkItemDao.update_check_items(checkListItemsDto);
        return R.ok();
    }

    @Override
    public R StartOrStop(CheckListItemsDto checkListItemsDto) {
        if(checkListItemsDto.getCheckListItemCode().length()==2) checkItemDao.updateChidren(checkListItemsDto);
        if("启用".equals(checkListItemsDto.getStatus())){
            CheckListPojo checkListPojo=new CheckListPojo();
            checkListPojo.setStatus("启用").setCheckListID(Integer.parseInt(checkListItemsDto.getCheckListID()));
            checkListDao.updateCheckList(checkListPojo);//如果每次都要判断父表需要启用，直接每次直接更新附表即可。
            checkItemDao.updateSelf(checkListItemsDto);
            checkListItemsDto.setCheckListItemCode(checkListItemsDto.getCheckListItemCode().substring(0,2));//更新父节点
            checkItemDao.updateParent(checkListItemsDto);

        }else if("停用".equals(checkListItemsDto.getStatus())){
                checkItemDao.updateSelf(checkListItemsDto);
                int i=checkItemDao.queryStatus(checkListItemsDto);//查询子节点还有没有启用，如果没有，表也需要停用
                if(i==0) {
                    CheckListPojo checkListPojo=new CheckListPojo();
                    checkListPojo.setStatus("停用").setCheckListID(Integer.parseInt(checkListItemsDto.getCheckListID()));
                    checkListDao.updateCheckList(checkListPojo);
                }
        }

        return R.ok();
    }


    @Override
    public R queryTree(Integer id) {
        List<CheckListItemsDto> list =checkItemDao.queryTree(id);
        Map<String, CheckListItemsDto> map = new TreeMap<>();
        List<Integer> code = new ArrayList<>();
        for (CheckListItemsDto pojo : list) {
            map.put(pojo.getCheckListItemCode(), pojo);
            if (code.indexOf(pojo.getCheckListItemCode().length()) == -1)
                code.add(pojo.getCheckListItemCode().length());
        }
        List<CheckListItemsDto> result = new ArrayList<>();
        Collections.sort(code);
        for (Map.Entry<String, CheckListItemsDto> entry : map.entrySet()) {
            String key = entry.getKey();
            if (key.length() == code.get(0))
                result.add(entry.getValue());
            else {
                CheckListItemsDto treeDto = map.get(key.substring(0, code.get(code.indexOf(key.length()) - 1)));
                if (null == treeDto)
                    continue;
                if (null == treeDto.getChildren()) {
                    List<CheckListItemsDto> tmp = new ArrayList<>();
                    tmp.add(entry.getValue());
                    treeDto.setChildren(tmp);
                } else
                    treeDto.getChildren().add(entry.getValue());
            }
        }
        return R.ok().put("data",result);
    }

    @Override
    public R delete_checkrecord(Integer id) {
        checkItemDao.delete_checkrecord(id);
        checkItemDao.delete_rectrecord(id);
        return R.ok();
    }

    @Override
    public R query_hseauditsystem() {
        List<HSEImportMapDto> list=checkItemDao.query_hseauditsystem();
        for (HSEImportMapDto pojo:list) {
            pojo.setEvalueItem(pojo.getType()+"|"+pojo.getEvalueItem());
        }
        return R.ok().put("data",list);
    }

    @Override
    public R query_qhseesystem() {
        List<QhseeSystemDto> list=checkItemDao.query_qhseesystem();
        List<String> list1=new ArrayList<>();
        for (QhseeSystemDto pojo:list) {
            if(!list1.contains(pojo.getQualitySystem())) list1.add(pojo.getQualitySystem());
            if(!list1.contains(pojo.getHSESystem())) list1.add(pojo.getHSESystem());
        }
        return R.ok().put("data",list1);
    }

    @Override
    public String query_information(ProblemListInDto problemListInDto,Integer id, Integer page, Integer size) {
        List<Integer> list=checkItemDao.QueryAuditGroupID(id);
        int total=checkItemDao.queryAllInformation(list,problemListInDto).size();
        PageHelper.startPage(page, size);
        List<QHSEECheckRecordPojo> result = checkItemDao.queryAllInformation(list,problemListInDto);

        return NR.r(result,total,page);
    }

}
